-- paquetage de base
with Ada.Text_IO, Ada.Integer_Text_IO;use Ada.Text_IO,Ada.Integer_Text_IO;
with GLib;
-- paquetages de gestion des exceptions
with Ada.Exceptions;use Ada.Exceptions;

-- paquetage du projet
with T_Standard; use T_Standard;

package body T_Fixe is




-- Implementation du telephone fixe
	task body Fixe is

	-- Decision de l'utilisateur
		estDecroche : Character;

	-- Attribut standard qui pointe vers le PID du standard de l'environnement
		Standard : GLib.Guint; 

		enPanne : boolean;

		monNum : GLib.Guint;

		enLigne : boolean;

		CONNEXION_FAILURE : exception;

		begin
			enPanne := false;
			enLigne := false;

			estDecroche := 'n';


			
			while(not(enPanne)) loop
				select
				----------------------------------------------------------------------------------
				-- Signalisation de l'appel entrant
					accept INIT(unNum : GLib.Guint; unStandard : GLib.Guint)
					do
						put_line("bip bip bip");
						monNum := unNum;
						Standard := unStandard;
					end INIT;

				----------------------------------------------------------------------------------
				or
				----------------------------------------------------------------------------------
				-- Signalisation de l'appel entrant
					accept APPEL_ENTRANT
					do
						put_line("bip bip bip");
					end APPEL_ENTRANT;

				----------------------------------------------------------------------------------
				or
				----------------------------------------------------------------------------------
				-- Le client decroche le combine
					accept DECROCHER
					do
						put_line("je decroche:");
						enLigne:=true;
					end DECROCHER;
				----------------------------------------------------------------------------------
				or
				----------------------------------------------------------------------------------
				-- Le Client peut parler quand il a decroche le combine
					accept PARLER(maVoix : in STRING)
					do
						put(Integer(monNum));
						put(" dit: ");
						put_line(maVoix);
					end PARLER;
				----------------------------------------------------------------------------------
				or
				----------------------------------------------------------------------------------
				-- Le Client peut ecouter quand il a decroche le combine
					accept ECOUTER(saVoix : in STRING)
					do
						if (enLigne) then
							put(Integer(monNum));
							put(" entend: ");
							put_line(saVoix);
						end if;
					end ECOUTER;
				----------------------------------------------------------------------------------
				or
				----------------------------------------------------------------------------------
				-- Mettre fin a la conversation
					accept RACCROCHER
					do
						put(Integer(monNum));
						put_line(" raccroche le telephone");
						enLigne := false;
					end RACCROCHER;
				----------------------------------------------------------------------------------
				or
				----------------------------------------------------------------------------------
				-- Notifier au Standard que l'on veut appeller un numéros
					accept APPELER(destinataire : in GLib.Guint)
					do
					-- Si le telephone n'est pas deja en communication
						if (not(enLigne)) then
						-- Appel à la fonction connexion du Standard
							if (T_Standard.CONNEXION(Integer(monNum),
								Integer(destinataire))=-1) then
								raise CONNEXION_FAILURE;
							end if;
					-- Sinon l'appelle n'est pas pris en compte
						else
							put_line("Telephone en cours de communication");
	
						end if;
					exception
					when E : others =>
						put_line("Erreur de connexion lors de l'appel");
						put("Exception Identity : ");
						put_line(Exception_Name(Exception_Identity(E)));
						put("Exception Name : ");
						put_line(Exception_Name(E));
						put("Exception message : ");
						put_line(Exception_Message(E));
						put("Exception information : ");
						put_line(Exception_Information(E));
					end APPELER;
				----------------------------------------------------------------------------------
				end select;
			end loop;
			exception
			when E : others =>
				put_line("Erreur dans la tache Fixe");
				put("Exception Identity : ");
				put_line(Exception_Name(Exception_Identity(E)));
				put("Exception Name : ");
				put_line(Exception_Name(E));
				put("Exception message : ");
				put_line(Exception_Message(E));
				put("Exception information : ");
				put_line(Exception_Information(E));
		end Fixe;


end T_Fixe;

------------------------------------------------------------------------------------------------------------------
-- IDEES EN VRAC

----------------
-- Mettre une variable nbUtilisation qui se decremente a chaque fois que le telephone est utilise.
-- Une fois arrivee a zero, le telephone tombe en panne
----------------